#include "rsalgorithm.h"
#include <QString>
#include <QObject>
#include <QThread>

RSAlgorithm::RSAlgorithm()
{
    m_InputImgVec.clear();
    m_OutputImgVec.clear();
    m_FuncCallBack = nullptr;
    m_pArg = nullptr;
    m_Msg = "";
}

bool RSAlgorithm::setInputImg(const char *pInputImg)
{
    //如果指针为空，则返回错误
    if ( (nullptr == pInputImg) || (0 == strcmp(pInputImg , "")) )
    {
        QString strMsg = QObject::tr("string is NULL");
        m_Msg = strMsg.toUtf8().data();
        return false;
    }

    //清空
    m_InputImgVec.clear();
    m_InputImgVec.push_back( pInputImg );

    return true;
}

//bool RSAlgorithm::setInputImg(std::string inputImg)
//{
//    //如果字符串为空，则返回错误
//    if ( "" == inputImg )
//    {
//        QString strMsg = QObject::tr("string is NULL");
//        m_Msg = strMsg.toUtf8().data();
//        return false;
//    }

//    //清空
//    m_InputImgVec.clear();
//    m_InputImgVec.push_back( inputImg );

//    return true;
//}

bool RSAlgorithm::setInputImg(std::vector<std::string> inputImgVec)
{
    //如果字符串为空，则返回错误
    if ( 0 == inputImgVec.size() )
    {
        QString strMsg = QObject::tr("string is NULL");
        m_Msg = strMsg.toUtf8().data();
        return false;
    }

    //清空
    m_InputImgVec.clear();
    std::copy(inputImgVec.begin() , inputImgVec.end() , m_InputImgVec.begin());

    return true;
}

bool RSAlgorithm::setOutputImg(const char *pOutputImg)
{
    //如果不符合要求，则返回为假
    if ( (nullptr == pOutputImg) || (0 == strcmp(pOutputImg , "")) )
    {
        QString strMsg = QObject::tr("string is NULL");
        m_Msg = strMsg.toUtf8().data();
        return false;
    }

    //清空
    m_OutputImgVec.clear();
    m_OutputImgVec.push_back( pOutputImg );

    return true;
}

bool RSAlgorithm::setOutputImg(std::string outputImg)
{
    //如果不符合要求，则返回为假
    if ( "" == outputImg )
    {
        QString strMsg = QObject::tr("string is NULL");
        m_Msg = strMsg.toUtf8().data();
        return false;
    }

    //清空
    m_OutputImgVec.clear();
    m_OutputImgVec.push_back( outputImg );

    return true;
}

bool RSAlgorithm::setOutputImg(std::vector<std::string> outputImgVec)
{
    //如果不符合要求，则返回为假
    if ( 0 == outputImgVec.size() )
    {
        QString strMsg = QObject::tr("string is NULL");
        m_Msg = strMsg.toUtf8().data();
        return false;
    }

    //清空
    m_OutputImgVec.clear();
    std::copy(outputImgVec.begin() , outputImgVec.end() , m_OutputImgVec.begin());

    return true;
}

void RSAlgorithm::setFunctionCallBack(RSFunctionCallBack pFuncCallBack, void *pArg )
{
    m_FuncCallBack = pFuncCallBack;
    m_pArg = pArg;
}

bool RSAlgorithm::disPose()
{
    QString strMsg = QObject::tr("start");
    setDisPoseState( 0 , strMsg.toUtf8().data());

    for ( int i = 0 ; i < 1000 ; i++ )
    {
        QThread::msleep( 10 );
        strMsg = QObject::tr("AlgorithmNO:%1").arg(i + 1);
        setDisPoseState( i , strMsg.toUtf8().data());
    }

    strMsg = QObject::tr("end");
    setDisPoseState( 1000 , strMsg.toUtf8().data());

    return true;
}

const char *RSAlgorithm::getMsg()
{
    return m_Msg.c_str();
}

void RSAlgorithm::setMsg(const char *pMsg)
{
    m_Msg = pMsg;
}

void RSAlgorithm::setDisPoseState(const int nValue, const char *pMsg)
{
    if ( nullptr == m_FuncCallBack )
    {
        return ;
    }

    m_FuncCallBack( nValue , pMsg , m_pArg );
}
